package org.harsh.transmission.mapper;

import cn.hutool.core.lang.Pair;
import org.apache.ibatis.annotations.Param;
import org.harsh.transmission.domain.TransTask;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 传输任务Mapper接口
 *
 * @author liuhaibo
 * @date 2024-08-25
 */

@Repository
public interface TransTaskMapper {
    /**
     * 查询传输任务
     *
     * @param taskId 传输任务主键
     * @return 传输任务
     */
    public TransTask selectTransTaskByTaskId(Long taskId);

    public TransTask selectTransTaskByMsgId(Long msgId);

    public TransTask selectTransTaskByMsgNodeId(@Param("msgId") Long msgId, @Param("recvNode") Long recvNode);

    /**
     * 查询传输任务状态列表
     * @param msgIdSet 消息编号集合
     * @return 传输任务状态集合
     */
    public List<Pair<Integer,Integer>> selectTaskStatusListByMsgIdSet(List<Integer> msgIdSet);

    /**
     * 查询传输任务列表
     *
     * @param transTask 传输任务
     * @return 传输任务集合
     */
    public List<TransTask> selectTransTaskList(TransTask transTask);

    /**
     * 获取未传输任务
     *
     * @param size
     * @return
     */
    public List<TransTask> selectUnTransTask(int size);

    /**
     * 获取单向未传输任务
     *
     * @param size
     * @return
     */
    public List<TransTask> selectUnuniTransTask(int size);

    /**
     * 获取节点未传输任务
     *
     * @param size
     * @return
     */
    public List<TransTask> selectNodeUnTransTask(@Param("recvNode") long recvNode, @Param("size") int size);

    /**
     * 获取组播、广播未传输任务；todo
     */
    public List<TransTask> selectUnTransOtherTypeTask(int size);


    /**
     * 新增传输任务
     *
     * @param transTask 传输任务
     * @return 结果
     */
    public int insertTransTask(TransTask transTask);

    /**
     * 修改传输任务
     *
     * @param transTask 传输任务
     * @return 结果
     */
    public int updateTransTask(TransTask transTask);

    /**
     * 置为成功
     * @param msgId
     * @return
     */
    public int setTransSuccess(@Param("msgId") long msgId);

    /**
     * 置为成功
     * @param taskId
     * @return
     */
    public int setNodeTransSuccess(@Param("taskId") long taskId);
    /**
     * 删除传输任务
     *
     * @param taskId 传输任务主键
     * @return 结果
     */
    public int deleteTransTaskByTaskId(Long taskId);

    /**
     * 批量删除传输任务
     *
     * @param taskIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteTransTaskByTaskIds(String[] taskIds);
}
